<!DOCTYPE html>
<!--
Author: attila@google.com (Attila Bodis)
-->
<html>
<!--
Copyright 2008 The Closure Library Authors. All Rights Reserved.

Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Closure Unit Tests - goog.ui.registry</title>
  <script src="../base.js"></script>
  <script>
    goog.require('goog.object');
    goog.require('goog.testing.jsunit');
    goog.require('goog.ui.decorate');
    goog.require('goog.ui.registry');
  </script>
</head>
<body>
  <div id="x" class="fake-component-x"></div>
  <div id="y" class="fake-component-y fake-component-x"></div>
  <div id="z" class="fake-component-z"></div>
  <div id="u"></div>
  <script>
    // Fake component and renderer implementations, for testing only.

    // UnknownComponent has no default renderer or decorator registered.
    function UnknownComponent() {
    }

    // FakeComponentX's default renderer is FakeRenderer.  It also has a
    // decorator.
    function FakeComponentX() {
      this.element = null;
    }

    FakeComponentX.prototype.decorate = function(element) {
      this.element = element;
    };

    // FakeComponentY doesn't have an explicitly registered default
    // renderer; it should inherit the default renderer from its superclass.
    // It does have a decorator registered.
    function FakeComponentY() {
      FakeComponentX.call(this);
    }
    goog.inherits(FakeComponentY, FakeComponentX);

    // FakeComponentZ is just another component.  Its default renderer is
    // FakeSingletonRenderer, but it has no decorator registered.
    function FakeComponentZ() {
    }

    // FakeRenderer is a stateful renderer.
    function FakeRenderer() {
    }

    // FakeSingletonRenderer is a stateless renderer that can be used as a
    // singleton.
    function FakeSingletonRenderer() {
    }

    FakeSingletonRenderer.instance_ = new FakeSingletonRenderer();

    FakeSingletonRenderer.getInstance = function() {
      return FakeSingletonRenderer.instance_;
    };

    function setUp() {
      goog.ui.registry.setDefaultRenderer(FakeComponentX, FakeRenderer);
      goog.ui.registry.setDefaultRenderer(FakeComponentZ,
          FakeSingletonRenderer);

      goog.ui.registry.setDecoratorByClassName('fake-component-x',
          function() {
            return new FakeComponentX();
          });
      goog.ui.registry.setDecoratorByClassName('fake-component-y',
          function() {
            return new FakeComponentY();
          });
    }

    function tearDown() {
      goog.ui.registry.reset();
    }

    function testDecorate() {
      var dx = goog.ui.decorate(document.getElementById('x'));
      assertTrue('Decorator for element with fake-component-x class must be ' +
          'a FakeComponentX', dx instanceof FakeComponentX);
      assertEquals('Element x must have been decorated',
          document.getElementById('x'), dx.element);

      var dy = goog.ui.decorate(document.getElementById('y'));
      assertTrue('Decorator for element with fake-component-y class must be ' +
          'a FakeComponentY', dy instanceof FakeComponentY);
      assertEquals('Element y must have been decorated',
          document.getElementById('y'), dy.element);

      var dz = goog.ui.decorate(document.getElementById('z'));
      assertNull('Decorator for element with unknown class must be null', dz);

      var du = goog.ui.decorate(document.getElementById('u'));
      assertNull('Decorator for element without CSS class must be null', du);
    }

  </script>
</body>
</html>
